// Copyright 2011, Vanya Davidenko.
// Кодировка файла: UTF-8. 
package info.iu9.red;
import java.util.Iterator;
import java.util.NoSuchElementException;



class Stack<T> implements Iterable<T> {
  public Iterator<T> iterator() {
    return new Iterator<T>() {
      public boolean hasNext() {
        return next_ != size_;
      }
      public T next() {
        if ( !hasNext() ) { throw new NoSuchElementException(); }
        return (T)array_[next_++];
      }
      public void remove() {
        throw new UnsupportedOperationException();
      }
      private int next_ = 0;
    };
  }

  Stack(final int max_size) {
    array_ = new Object[max_size];
    size_ = 0;
  }

  T pop() {
    final T result = top();
    array_[--size_] = null;
    return result;
  }
  T top() {
    return (T)array_[size_ - 1];
  }

  void push(final T v) {
    array_[size_++] = v;
  }

  // Очистка стека за O(1).
  // Да, возникнет утечка памяти. Однако если в ближайшее время стек
  // будет продолжать использоваться, то старые ссылки будут затерты новыми.
  void fastClear() {
    size_ = 0;
  }
  void clear() {
    while ( size_ > 0 ) {
      array_[size_--] = null;
    }
    assert size_ == 0;
  }

  boolean isEmpty() {
    return size_ == 0;
  }
  int size() {
    return size_;
  }

  void swap(final Stack<T> rhv) {
    final Object[] tmp_array = array_;
    array_ = rhv.array_;
    rhv.array_ = tmp_array;

    final int tmp_size = size_;
    size_ = rhv.size_;
    rhv.size_ = tmp_size;
  }

  private Object[] array_;
  private int size_;
}
